%{
#include <stdio.h>
%}
%token IDENTIF C_ENTERA T_ENTERO STRING SALTO_LINEA OP_ASIGNACION OP_TIPO OP_DELIMITADOR OP_ARIT_SUMAR PUNTO ABRE_PARENTESIS CIERRA_PARENTESIS COMA OP_RELACIONAL
%%
PAQUETE                 : DECLARACION_PAQUETE CUERPO_PAQUETE;

DECLARACION_PAQUETE     : 'package' IDENTIF 'is'
                              DECLARACIONES
                           'end' IDENTIF ';';

CUERPO_PAQUETE          : 'package' 'body' IDENTIF 'is'
                             DECLARACION_SUBPROGRAMAS
                          'begin'
                             BLOQUE_SENTENCIAS
                          'end' IDENTIF ';';

DECLARACION_SUBPROGRAMA  : 'procedure' IDENTIF '(' DECLARACION_PARAMETROS ')' 'is'  //  CAMBIADO respecto gramatica.txt
                            DECLARACIONES
                          'end' IDENTIF ';';

DECLARACION_SUBPROGRAMAS : DECLARACION_SUBPROGRAMA DECLARACION_SUBPROGRAMAS;  //  CAMBIADO respecto gramatica.txt
DECLARACION_SUBPROGRAMAS : ;

CONSTANTE               : C_ENTERA;
CONSTANTE               : STRING;
CONSTANTE               : 'true';  // FALTA
CONSTANTE               : 'false';  // FALTA

OPERADORES              : OP_ARIT_SUMAR;  // FALTA
OPERADORES              : OP_RELACIONAL;
OPERADORES              : 'and'; // FALTA // mejor un or

DECLARACIONES           : DECLARACION_TIPOS DECLARACIONES;
DECLARACIONES           : DECLARACION_VARIABLES DECLARACIONES;
DECLARACIONES           : DECLARACION_SUBPROGRAMAS DECLARACIONES;
DECLARACIONES           : ;  // lambda

EXPRESION               : 'true'; // cambiado de sitio
EXPRESION               : 'false'; // cambiado de sitio
EXPRESION               : CONSTANTE; // cambiado de sitio
EXPRESION               : IDENTIF; // cambiado de sitio
EXPRESION               : EXPRESION '+' EXPRESION;    // cambiado de sitio
EXPRESION               : EXPRESION 'and' EXPRESION; // cambiado de sitio

DECLARACION_VARIABLES   : IDENTIF ',' DECLARACION_VARIABLES;
DECLARACION_VARIABLES   : IDENTIF ':' TIPO ';';
DECLARACION_VARIABLES   : IDENTIF ':' TIPO ':=' EXPRESION ';';

DECLARACION_PARAMETROS  : IDENTIF ':' FORMA TIPO ',' DECLARACION_PARAMETROS;
DECLARACION_PARAMETROS  : IDENTIF ':' FORMA TIPO;

COMPROBACION_PARAMETROS : IDENTIF ':' FORMA TIPO ',' COMPROBACION_PARAMETROS;
COMPROBACION_PARAMETROS : IDENTIF ':' FORMA TIPO;



FORMA                   : 'in';
FORMA                   : 'out';
FORMA                   : 'in out';

TIPO                    : 'boolean';
TIPO                    : 'integer';

DECLARACION_TIPOS       : 'type' IDENTIF '=' 'array' '(' IDENTIF '..' IDENTIF ')' 'of' TIPO ';' ;


BLOQUE_SENTENCIAS       : SENTENCIA BLOQUE_SENTENCIAS;
BLOQUE_SENTENCIAS       : SENTENCIA;

SENTENCIA               : IDENTIF ':=' EXPRESION ';' ;
SENTENCIA               : 'if' EXPRESION 'then'
                             BLOQUE_SENTENCIAS
                          'else'
                             BLOQUE_SENTENCIAS
                          'end' 'if' ';';
SENTENCIA               : 'if' EXPRESION then
                             BLOQUE_SENTENCIAS
                          'end' 'if' ';';

ARGUMENTOS              : IDENTIF ',' ARGUMENTOS;  // Camgiado de orden

SENTENCIA               : IDENTIF '(' ARGUMENTOS ')' ';';
SENTENCIA               : IDENTIF ';';



SENTENCIA               : 'return' ';';



CUERPO_SUBPROGRAMA      : 'procedure' 'body' IDENTIF '(' 
                                                     COMPROBACION_PARAMETROS
                                         ')' 'is'
                             DECLARACION_SUBPROGRAMAS
                          'begin'
                             BLOQUE_SENTENCIAS
                          'end' IDENTIF ';';